<?php

class PerguntaInscricao
{
	private $idPergunta;
	private $idCurso;
	private $idPerguntaPadrao;
	private $pergunta;
	private $tipo;
	private $alternativas	=	array();
	private $padrao;
	
	public function PerguntaInscricao ($idPergunta, $padrao = false) {
		if ($padrao)
			$tabelaPerguntasBanco		=	'perguntasInscricaoPadrao';
		else
			$tabelaPerguntasBanco		=	'perguntasInscricao';
			
		$strQuery	=	"SELECT * FROM " . $tabelaPerguntasBanco . " WHERE idPergunta = " . $idPergunta . ";";
		
		$resultado	=	BancoDados::query($strQuery);
		
		if (is_array($resultado)) {
			$this->setIdPergunta($idPergunta);
			$this->setPadrao($padrao);
			if (!$padrao) {
				$this->setIdCurso($resultado[0]['idCurso']);
				$this->setIdPerguntaPadrao($resultado[0]['idPerguntaPadrao']);
			}
			else {
				$this->setIdCurso(NULL);
				$this->setIdPerguntaPadrao(NULL);
			}
			
			$this->setPergunta($resultado[0]['pergunta']);
			$this->setTipo($resultado[0]['tipo']);
			
			if ($alternativas = PerguntaInscricaoAlternativa::buscar($idPergunta, $padrao)) {
				$listaAlternativas	=	array();
				
				foreach($alternativas['listaResultados'] as $alternativa) {
					$listaAlternativas[$alternativa['idAlternativa']]	=	$alternativa['alternativa'];
				}
				
				$this->setAlternativas($listaAlternativas);
			}
			else
				$this->setIdPergunta(NULL);
			
		}
		else {
			$this->setIdPergunta(NULL);
		}
	}
	
	public static function inserir($idCurso, $idPerguntaPadrao, $strPergunta, $strTipo, $alternativas, $padrao = false) {
		if (PerguntaInscricao::validar($idCurso, $idPerguntaPadrao, $strPergunta, $strTipo, $alternativas, $padrao)) {
			if ($padrao) {
				$tabelaPerguntasBanco		=	'perguntasInscricaoPadrao';
			}
			else {
				$tabelaPerguntasBanco		=	'perguntasInscricao';
			}
			
			$strQuery	=	'INSERT INTO ' . $tabelaPerguntasBanco . ' VALUES(default, ';
			
			$strQuery	.=	$padrao ? '' : $idCurso . ', ';
			$strQuery	.=	$padrao ? '' : ($idPerguntaPadrao != NULL ? $idPerguntaPadrao . ', ' : 'NULL, ');
			$strQuery	.=	'"' . $strPergunta . '", "' . $strTipo . '");';
			
			if (BancoDados::query($strQuery)) {
				if ($strTipo == 'Seleção Múltipla' || $strTipo == 'Seleção Única') {
					//TODO USAR LOCK TABLE
					$strQuery	=	'SELECT idPergunta FROM ' . $tabelaPerguntasBanco . ' WHERE pergunta = "' . $strPergunta . '" ORDER BY idPergunta DESC LIMIT 1 OFFSET 0;';
					
					$resultado	=	BancoDados::query($strQuery);
					
					if (is_array($resultado)) {
						foreach ($resultado as $linha) {
							$idPergunta	=	$linha['idPergunta'];
						}
						
						$alternativasValidas	=	array();
						foreach ($alternativas as $alternativa) {
							if ($alternativa != '') {
								array_push($alternativasValidas, $alternativa);
							}
						}
						
						if (PerguntaInscricaoAlternativa::inserir($idPergunta, $alternativasValidas, $padrao)) {
							return true;
						}
						else {
							//SE CONSEGUI INSERIR A PERGUNTA, NAO CONSEGUIU INSERIR AS ALTERNATIVAS, MAS NAO CONSEGUIU APAGAR A PERGUNTA
							if (!PerguntaInscricao::apagar($idPergunta, $padrao)) {
								email(constant('EMAIL_ADM'), 'ERRO', null, 'EMAIL_ERRO_PERGUNTA_INSCRICAO', array($idPergunta, $padrao == true ? 'Pergunta de Inscrição Padrão' : 'Pergunta de Inscrição'));
							}
							return false;
						}
					}
					else {
						//SE CONSEGUI INSERIR A PERGUNTA, NAO CONSEGUIU INSERIR AS ALTERNATIVAS, MAS NAO CONSEGUIU APAGAR A PERGUNTA
						if (!PerguntaInscricao::apagar($idPergunta, $padrao)) {
							email(constant('EMAIL_ADM'), 'ERRO', null, 'EMAIL_ERRO_PERGUNTA_INSCRICAO', array($idPergunta, $padrao == true ? 'Pergunta de Inscrição Padrão' : 'Pergunta de Inscrição'));
						}
						return false;
					}
				}
				else {
					return true;
				}
			}
			else {
				return false;
			}
		}
		return false;
	}
	
	public static function editar ($idPergunta, $idCurso, $idPerguntaPadrao, $strPergunta, $strTipo, $alternativas, $padrao = false) {
		if (PerguntaInscricao::validar($idCurso, $idPerguntaPadrao, $strPergunta, $strTipo, $alternativas, $padrao)) {
			if ($padrao)
				$tabelaPerguntasBanco		=	'perguntasInscricaoPadrao';
			else
				$tabelaPerguntasBanco		=	'perguntasInscricao';
			
			$strQuery	=	'UPDATE ' . $tabelaPerguntasBanco . ' SET ';
			
			$strQuery	.=	$idCurso != NULL && !$padrao ? 'idCurso = ' . $idCurso . ', ' : '';
			$strQuery	.=	$idPerguntaPadrao === false && !$padrao ? 'idPerguntaPadrao = NULL, ' : ($idPerguntaPadrao != NULL && !$padrao ? 'idPerguntaPadrao = ' . $idPerguntaPadrao . ', ' : '');
			$strQuery	.=	'pergunta = "' . $strPergunta . '", ';
			$strQuery	.=	'tipo = "' . $strTipo . '" ';
			
			$strQuery	.=	'WHERE idPergunta = ' . $idPergunta . ';';
			if (BancoDados::query($strQuery)) {
				if (PerguntaInscricaoAlternativa::apagarAlternativas($idPergunta, $padrao)) {
					if ($strTipo == 'Seleção Múltipla' || $strTipo == 'Seleção Única') {
						$alternativasValidas	=	array();
						foreach ($alternativas as $alternativa) {
							if ($alternativa != '') {
								array_push($alternativasValidas, $alternativa);
							}
						}
						
						if (PerguntaInscricaoAlternativa::inserir($idPergunta, $alternativasValidas, $padrao)) {
							return true;
						}
						else {
							return false;
						}
					}
					else {
						return true;
					}
				}
				else {
					return false;
				}
			}
			else {
				return false;
			}
		}
		else {
			return false;
		}
	}
	
	public static function apagar ($idPergunta, $padrao = false) {
		if ($padrao)
			$tabelaPerguntasBanco		=	'perguntasInscricaoPadrao';
		else
			$tabelaPerguntasBanco		=	'perguntasInscricao';
		
		$strQuery	=	"DELETE FROM " . $tabelaPerguntasBanco . " WHERE idPergunta = " . $idPergunta . ";";
		
		return BancoDados::query($strQuery);
	}
	
	public static function validar ($idCurso, $idPerguntaPadrao, $strPergunta, $strTipo, $alternativas, $padrao) {
		$validou	=	true;
		
		if (!is_numeric($idCurso) && !$padrao) {
			$validou 	=	false;
			//TODO MENSAGEM??
		}
		
		if (!is_numeric($idPerguntaPadrao) && $idPerguntaPadrao != NULL && !$padrao) {
			$validou 	=	false;
			//TODO MENSAGEM??
		}
		
		if(!validaAlfaNumerico($strPergunta)) {
			$validou 	=	false;
			adicionaMensagem(texto('MENSAGEM_ERRO_VALIDACAO_PERGUNTA'), 'erro');
		}
		
		if ($strTipo != 'Discursiva' && $strTipo != 'Sim e Não' && $strTipo != 'Seleção Única' && $strTipo != 'Seleção Múltipla') {
			$validou	=	false;
			adicionaMensagem(texto('MENSAGEM_ERRO_VALIDACAO_TIPO_PERGUNTA'), 'erro');
		}
		
		if (($strTipo == 'Seleção Múltipla' || $strTipo == 'Seleção Única')) {
			$alternativasValidas 	=	array();
			foreach($alternativas as $alternativa) {
				if (validaAlfaNumerico($alternativa, constant('__TAM_ALTERNATIVA_PERGUNTA_DE_INSCRICAO__')) && $alternativa != '')
					array_push($alternativasValidas, $alternativa);
			}
			
			if (sizeof($alternativasValidas) < 2) {
				$validou 	=	false;
				adicionaMensagem(texto('MENSAGEM_ERRO_VALIDACAO_ALTERNATIVAS'), 'erro');
			}
		}
		return $validou;
	}
	
	public static function buscar ($idCurso = NULL, $strTipo = NULL, $idPerguntaPadrao = NULL, $padrao = false, $ordenacaoAtual = NULL, $ordemAtual = NULL, $resultadosPagina = NULL, $paginaAtual = NULL) {
		if (PerguntaInscricao::validarBusca($idCurso, $strTipo, $idPerguntaPadrao, $padrao)) {
			if ($padrao) {
				$tabelaPerguntasBanco		=	'perguntasInscricaoPadrao';
				$tabelaAlternativasBanco	=	'perguntasInscricaoPadraoAlternativas';
			}
			else {
				$tabelaPerguntasBanco		=	'perguntasInscricao';
				$tabelaAlternativasBanco	=	'perguntasInscricaoAlternativas';
			}
				
			$strQuery	=	'SELECT ' . $tabelaPerguntasBanco . '.*, COUNT(' . $tabelaAlternativasBanco . '.idAlternativa) as qtdAlternativas FROM ' . $tabelaPerguntasBanco . ' LEFT JOIN ' . $tabelaAlternativasBanco . ' ON ' . $tabelaPerguntasBanco . '.idPergunta = ' . $tabelaAlternativasBanco . '.idPergunta WHERE ';
			
			$strQuery	.=	$idCurso != NULL && !$padrao ? $tabelaPerguntasBanco . '.idCurso = ' . $idCurso . ' AND ' : '';
			$strQuery	.=	$strTipo != NULL ? $tabelaPerguntasBanco . '.tipo = "' . $strTipo . '" AND ' : '';
			$strQuery	.=	$idPerguntaPadrao === false ? 'idPerguntaPadrao IS NULL AND ' : ($idPerguntaPadrao != NULL && !$padrao ? $tabelaPerguntasBanco . '.idPerguntaPadrao = ' . $idPerguntaPadrao . ' AND ' : '');
			//CONSERTANDO FINAL DA QUERY
			$strQuery	=	preg_replace('/ WHERE $/', ' ', $strQuery);
			$strQuery	=	preg_replace('/ AND $/', ' ', $strQuery);
			
			$strQuery	.=	' GROUP BY ' . $tabelaPerguntasBanco . '.idPergunta';
			
			$strQueryCount	=	'SELECT COUNT(*) AS qtdResultados FROM (' . $strQuery . ') AS queryOriginal;';
			
			if ($resultadoCount = BancoDados::query($strQueryCount)) {
				foreach($resultadoCount as $resultado) {
					$qtdResultados	=	$resultado['qtdResultados'];
				}
				
				if ($qtdResultados > 0) {
					$paginaAtual	=	$paginaAtual == NULL ? 1 : $paginaAtual;
					$ordenacaoAtual	=	$ordenacaoAtual == NULL ? 'pergunta' : $ordenacaoAtual;
					$ordemAtual		=	$ordemAtual == NULL ? 'ASC' : ($ordemAtual == 'desc' ? 'DESC' : 'ASC');
					
					$strQuery	.=	' ORDER BY ' . $ordenacaoAtual . ' ' . $ordemAtual;
					
					if ($resultadosPagina != NULL) {
						$qtdPaginas		=	ceil($qtdResultados / $resultadosPagina);
						$qtdPaginas		=	$qtdPaginas == 0 ? 1 : $qtdPaginas;
						
						$strQuery		.=	' LIMIT ' . $resultadosPagina . ' OFFSET ' . (($paginaAtual - 1) * $resultadosPagina);
					}
					else {
						$qtdPaginas	=	1;
					}
					
					$strQuery	.=	';';
					
					$resultado	=	BancoDados::query($strQuery);
					
					if (is_array($resultado)) {
						return array ('listaResultados' => $resultado, 'qtdResultadosTotal' => $qtdResultados, 'qtdPaginas' => $qtdPaginas);
					}
					else {
						return false;
					}
				}
				else {
					return array('listaResultados' => array(), 'qtdResultadosTotal' => 0, 'qtdPaginas' => 0);
				}
			}
			else {
				return false;
			}
		}
		else {
			return false;
		}
	}
	
	public static function validarBusca($idCurso, $strTipo, $idPerguntaPadrao, $padrao) {
		return true;
	}
	
	public static function responderPergunta ($idUsuario, $idCurso, $idPergunta, $idAlternativa, $resposta) {
		if (is_numeric($idUsuario) && is_numeric($idCurso) && is_numeric($idPergunta)) {
			$strQuery	=	"INSERT INTO perguntasInscricaoRespostas VALUES(default, ";
			$strQuery .=	$idUsuario . ", ";
			$strQuery .=	$idCurso . ", ";
			$strQuery .=	$idPergunta . ", ";
			$strQuery .=	$idAlternativa != null && is_numeric($idAlternativa) ? $idAlternativa . ", " : "NULL, ";
			$strQuery .=	"\"" . $resposta . "\");";
			
			if (BancoDados::query($strQuery)) {
				return true;
			}
			else {
				return false;
			}
		}
		else {
			return false;
		}
	}
	
	public function setIdPergunta($idPergunta) {
		$this->idPergunta	=	$idPergunta;
	}
	
	public function getIdPergunta() {
		return $this->idPergunta;
	}
	
	public function setIdCurso($idCurso) {
		$this->idCurso	=	$idCurso;
	}
	
	public function getIdCurso() {
		return $this->idCurso;
	}
	
	public function setIdPerguntaPadrao($idPerguntaPadrao) {
		$this->idPerguntaPadrao	=	$idPerguntaPadrao;
	}
	
	public function getIdPerguntaPadrao() {
		return $this->idPerguntaPadrao;
	}
	
	public function setPergunta($pergunta) {
		$this->pergunta	=	$pergunta;
	}
	
	public function getPergunta() {
		return $this->pergunta;
	}
	
	public function setTipo($tipo) {
		$this->tipo	=	$tipo;
	}
	
	public function getTipo() {
		return $this->tipo;
	}
	
	public function setAlternativas($alternativas) {
		$this->alternativas	=	$alternativas;
	}
	
	public function getAlternativas() {
		return $this->alternativas;
	}
	
	public function setPadrao($padrao) {
		$this->padrao	=	$padrao;
	}
	
	public function getPadrao() {
		return $this->padrao;
	}
}